package org.elsfs.cloud.common.mybatis.ext.mybatis.extension;


import org.elsfs.cloud.common.mybatis.ext.sql.Join;
import org.elsfs.cloud.common.mybatis.ext.sql.JoinBuilder;
import org.elsfs.cloud.common.mybatis.ext.sql.JoinConditionBuilder;
import org.elsfs.cloud.common.util.lang.StringUtils;

import java.io.Serializable;
import java.util.Collection;
/**
 * JOIN查询拓展接口
 *
 * @param <C> 子类具体类型
 * @param <JB> JOIN构建器类型
 * @param <JCB> JOIN条件构建器类型
 */
public interface JoinWrapper<
        C extends JoinWrapper<C, JB, JCB>,
        JB extends JoinBuilder<JB, JCB, C>,
        JCB extends JoinConditionBuilder<JCB, JB, C>
        > extends Join<C, JB, JCB>, Serializable {

    /**
     * 选择字段分隔符
     */
    String FIELD_SEPARATOR = ", ";
    /**
     * 主表别名前缀
     */
    String TABLE_ALIAS_PREFIX = "t.";

    /**
     * 获取JOIN的SQL片段
     *
     * @return SQL片段
     */
    String getJoinSqlSegment();
    /**
     * 是否已清空默认的选择字段
     *
     * @return bool
     */
    boolean isClearedDefaultSelectedFields();
    /**
     * 清空默认的选择字段
     *
     * @return this
     */
    C clearDefaultSelectedFields();

    /**
     * 合并SQL选择字段
     *
     * @param existedFields 已存在字段
     * @param newFields 新的选择字段
     * @return 合并后的选择字段
     */
    static String mergeSelectedFields(String existedFields, String[] newFields) {
        if (StringUtils.isNotBlank(existedFields)) {
            return existedFields + FIELD_SEPARATOR + String.join(FIELD_SEPARATOR, newFields);
        } else {
            return String.join(FIELD_SEPARATOR, newFields);
        }
    }

    /**
     * 合并SQL选择字段
     *
     * @param existedFields 已存在字段
     * @param newFields 新的选择字段
     * @return 合并后的选择字段
     */
    static String mergeSelectedFields(String existedFields, Collection<String> newFields) {
        if (StringUtils.isNotBlank(existedFields)) {
            return existedFields + FIELD_SEPARATOR + String.join(FIELD_SEPARATOR, newFields);
        } else {
            return String.join(FIELD_SEPARATOR, newFields);
        }
    }
}
